package com.yc.config;

import com.yc.services.ToolServices;
import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.*;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {

    // 定义AI服务接口（注意保持命名一致）
    public interface AiAssistant {
        @SystemMessage("当前用户存在心理健康支持需求，你作为支持性倾听者，定位为人本主义陪伴型（共情理解）")
        TokenStream chatStreamListener(@MemoryId String memoryId, @UserMessage String question);

        @SystemMessage("当前用户存在心理健康支持需求，你作为认知行为教练，定位为解决方案导向型（行为激活）")
        TokenStream chatStreamTrainer(@MemoryId String memoryId, @UserMessage String question);

        @SystemMessage("当前用户存在心理健康支持需求，你作为心理治疗师，定位为认知重构型（洞察引导）")
        TokenStream chatStreamMentalTutor(@MemoryId String memoryId, @UserMessage String question);

        // 新增：角色互换模式 - AI扮演心理疾病患者
        @SystemMessage("你现在扮演一个心理疾病患者，正在接受心理医生的治疗。你需要根据不同的心理疾病类型（如抑郁症、焦虑症、强迫症等）来模拟相应的症状和行为模式。你的回答应该表现出患者的真实感受、困惑和症状，让心理医生能够进行准确的诊断和治疗。记住，你是一个需要帮助的患者，而不是治疗师。")
        TokenStream chatStreamPatient(@MemoryId String memoryId, @UserMessage String question);

        @SystemMessage("""
                        我将根据你最近的互动记录（聊天、图片分享等）来理解你的状态，并以结构化的方式提供支持。
    
                        **请按照以下模板组织你的回复：**
                        ---
                        **🌱 我注意到...**  
                        {情绪观察}（描述用户最近的情绪变化，避免诊断性语言）
    
                        **💡 可能的原因...**  
                        {潜在压力源}（温和推测可能的困扰来源，避免绝对化表述）
    
                        **🤗 我们可以尝试...**  
                        {支持建议}（提供2-3个具体、可操作的建议）
    
                        **📝 你愿意聊聊...**  
                        {开放式问题}（引导用户进一步表达，例如："最近哪些事让你感觉有压力？"）
                        ---
    
                        要求：
                        1. 使用温暖、共情的语气，避免专业术语
                        2. 建议需具体且贴近用户实际生活
                        3. 最后以一个开放式问题结尾，鼓励用户参与对话
                        4. 所有内容以中文呈现
                        """)
        String analyzeUserHistory(@MemoryId String memoryId,@UserMessage String question);



    }

    @Bean
    public InMemoryEmbeddingStore<TextSegment> embeddingStore() {
        return new InMemoryEmbeddingStore<>();
    }
//    @Bean
//    public EmbeddingStore<TextSegment> elasticsearchEmbeddingStore(ElasticsearchClient elasticsearchClient,
//                                                               QwenEmbeddingModel qwenEmbeddingModel) {
//        // 从 ElasticsearchClient 中获取底层的 RestClient
//       RestClient restClient = ((RestClientTransport) elasticsearchClient._transport()).restClient();
//
//        /**
//         * 构建并返回一个基于Elasticsearch的向量嵌入存储实例，
//         * 用于存储文本嵌入向量并支持向量相似度搜索。
//         */
//        return ElasticsearchEmbeddingStore.builder()
//                // 配置Elasticsearch REST客户端，用于与Elasticsearch集群通信
//                // restClient应已预先配置好集群地址、认证信息等
//                .restClient(restClient)
//                // 指定存储向量数据的Elasticsearch索引名称
//                // 索引类似于数据库中的表，用于组织和存储文档
//                .indexName("langchain4j-embeddings")
//                // 设置向量维度，必须与嵌入模型生成的向量维度一致
//                // qwenEmbeddingModel.dimension()返回Qwen模型生成的向量维度（如768、1536等）
//                .dimension(qwenEmbeddingModel.dimension())
//                // 构建并初始化ElasticsearchEmbeddingStore实例
//                .build();
//    }

    @Bean
    public AiAssistant aiAssistant(ChatModel chatModel,
                                   StreamingChatModel streamingChatModel,
                                   ChatMemoryStore chatMemoryStore,
                                   ToolServices tools,
                                   EmbeddingStore embeddingStore,
                                   QwenEmbeddingModel qwenEmbeddingModel,
                                   McpToolProvider mcpToolProvider) {

        ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)
                .maxMessages(1000)
                .chatMemoryStore(chatMemoryStore)
                .build();

        EmbeddingStoreContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
                .embeddingModel(qwenEmbeddingModel)
                .embeddingStore(embeddingStore)
                .build();

        return AiServices.builder(AiAssistant.class)
                .chatModel(chatModel).streamingChatModel(streamingChatModel)
                .chatMemoryProvider(chatMemoryProvider)
                .tools(tools)
                .toolProvider(mcpToolProvider) // 添加MCP工具提供者
                .contentRetriever(retriever)
                .build();
    }
}
